module route.router;

import vibe.vibe;
import controller.login;
import controller.user;
import controller.menu;
import controller.dept;
import controller.role;

/** 
 * 初始化路由、绑定处理函数、监听端口
 */
void initRouter()
{
    import std.functional : toDelegate;

    auto settings = new HTTPServerSettings();
    settings.port = 7979;
    settings.bindAddresses = ["127.0.0.1"];
    settings.errorPageHandler = toDelegate(&errorPage);

    // router路由初始化
    auto router = new URLRouter();

    // 登录
    router.post("/api/auth/login", &login);
    // 退出登录
    router.delete_("/api/auth/logout", &logout);
    // 获取用户信息
    router.get("/api/users/me", &getMeInfo);
    // 获取路由列表
    router.get("/api/menus/routes", &getRoutes);

    // token校验，此后面的路由认证后才能访问
    router.any("*", &checkToken);
    // 用户
    // 获取用户列表
    router.get("/api/users/page", &getUsers);
    // 添加用户
    router.post("/api/users", &addUser);
    // 删除用户
    router.delete_("/api/users/:userid", &deleteUser);
    // 重置密码
    router.patch("/api/users/resetpwd/:userid", &resetUserPwd);
    // 修改用户状态
    router.patch("/api/users/:userid/status", &editUserStatus);
    // 角色
    // 获取角色下拉列表
    router.get("/api/roles/options", &getRoleOptions);
    // 获取角色列表
    router.get("/api/roles/page", &getRoles);
    // 获取角色菜单ids
    router.get("/api/roles/:roleid/menuIds", &getRoleMenuIds);
    // 为角色分配权限
    router.put("/api/roles/:roleid/menus", &roleAssignPerm);
    // 添加角色
    router.post("/api/roles", &addRole);
    // 编辑角色时获取数据
    router.get("/api/roles/:roleid/form", &getRoleInfo);
    // 删除角色
    router.delete_("/api/roles/:roleid", &deleteRole);
    // 编辑角色
    router.put("/api/roles/:roleid", &editRole);
    // 菜单
    // 获取菜单列表
    router.get("/api/menus", &getMenuList);
    // 获取菜单下拉列表
    router.get("/api/menus/options", &getMenuOptions);
    // 添加菜单
    router.post("/api/menus", &addMenu);
    // 编辑菜单时获取详情数据
    router.get("/api/menus/:menuid/form", &getMenuInfo);
    // 编辑菜单
    router.put("/api/menus/:menuid", &editMenu);
    // 删除菜单
    router.delete_("/api/menus/:menuid", &deleteMenu);
    // 部门
    // 获取部门下拉列表
    router.get("/api/dept/options", &getDeptOptions);
    // 获取部门列表
    router.get("/api/deptlist", &getDeptList);
    // 添加部门
    router.post("/api/dept", &addDept);
    // 获取部门详情
    router.get("/api/dept/:deptid", &getDeptInfo);
    // 删除部门
    router.delete_("/api/dept/:deptid", &deleteDept);
    // 修改部门信息
    router.put("/api/dept/:deptid", &editDept);

    // 启动http服务
    auto listener = listenHTTP(settings, router);
    scope (exit)
    {
        import core.stdc.stdlib : exit;

        // 停止http服务
        listener.stopListening();
        // 彻底退出程序
        exit(0);
    }

    logInfo("It is run http://127.0.0.1:7979/");

    runApplication();
}

/** 
 * http异常处理函数
 */
void errorPage(HTTPServerRequest req,
    HTTPServerResponse resp,
    HTTPServerErrorInfo error)
{
    import std.json : JSONValue;

    JSONValue data = ["code": error.code];
    data.object["msg"] = JSONValue(error.message);
    resp.writeJsonBody(data, error.code);
}
